#ifndef TIMEOUT_QUEUE_H_
#define TIMEOUT_QUEUE_H_
#include "BlockingQueue.hh"

//
/**
 * \file TimeoutQueue.hh
 * \author  jsk <jsk.jinsubkim@gmail.com>
 * \version 1.0
 *
 * \class TimeoutQueue TimeoutQueue.hh
 *
 * 큐에서 오브젝트를 출력할 때 최대 지정된 시간 만큼만 대기한다.
 * 
 * BlockingQueue 클래스는 무한정 기다리는 반면에 TimeoutQueue 클래스는
 * 지정된 시간 만큼 대기한다. 만약 대기 시간을 지정하지 않았다면, 기본으로 
 * 0.1초 대기한다.
 */
class TimeoutQueue : public BlockingQueue
{
public:
	/**
	 * \name TimeoutQueue
	 */
	TimeoutQueue();
	
	/**
	 * \name TimeoutQueue
	 * \param WaitingTime 대기 시간(마이크로 초).
	 */
	TimeoutQueue(USNumber WaitingTime);
	
	/**
	 * \name setTimeout
	 * \param WaitingTime 대기 시간(마이크로 초).
	 * 
	 * 대기 시간을 설정한다.
	 * 
	 * Signal 클래스의 setTimeout 함수를 이용해서 대기 시간을 설정한다.
	 * WaitingTime이 0이면 기다리지 않고, -1이면 시간 제한없이 기다린다.
	 * 
	 * \warning
	 * 
	 * 단, 이미 대기하고 있는 스레드에게는 적용되지 않는다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf setTimeout(USNumber WaitingTime);
	
// Timeout
protected:
	/**
	 * \name setTimeout
	 * \param WaitingTime 대기 시간(마이크로 초).
	 * 
	 * 대기 시간을 설정한다.
	 * 
	 * setTimeout 메소드와 같은 일을 하지만 State를 확인하지 않는다.
	 * 
	 * \see setTimeout
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf setTimeout_(USNumber WaitingTime);
};

#endif //TIMEOUT_QUEUE_H_